////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////@

Pektis.prototype.pektisFixDOM = function() {
	this.pektisBoxJQL({ola:1}).pektisFixDOM(this.login);
	this.pektisProsklisiJQL().prosklisiOnlineFixDOM(this.login);
	this.pektisAnazitisiJQL().anazitisiOnlineFixDOM(this.login);
	return this;
}

// Η μέθοδος "pektisDOM" ετοιμάζει ένα DOM element για τον παίκτη, που αφορά στις
// εμφανίσεις τού παίκτη ως περιφερόμενου (RB), ως θεατού στο καφενείο (TH), ως
// θεατού στην παρτίδα (SH), και ως νεοφερμένου (NF).

Pektis.prototype.pektisDOM = function(id) {
	return $('<div>').attr({
		id: id + this.login,
	}).addClass('pektisBox').
	append(this.onomaDOM(id)).
	axiomaDOM();
}

jQuery.fn.axiomaDOM = function() {
	return $(this).each(function() {
		$(this).append($('<img>').addClass('pektisAxiomaIcon').css({display: 'none'}).
			attr({src: Client.server + 'images/misc/noImage.png'}));
	});
}

// Η μέθοδος "onomaDOM" επιστρέφει τον εσωτερικό κόμβο μιας περιοχής παίκτη
// ως jQuery node. Ο εσωτερικός κόμβος μιας περιοχής παίκτη είναι μια φαρδιά
// λωρίδα που περιέχει βασικά το όνομα και το εικονίδιο του προφίλ, ενώ στους
// νεοφερμένους περιέχεται και εικονίδιο διαγραφής του παίκτη από το προσκήνιο.

Pektis.prototype.onomaDOM = function(id) {
	var html, p, q, pektis = this;

	p = $('<div>').addClass('pektisOnoma');
	if (pektis.anazitisiMatchOnoma()) p.addClass('trapeziPektisAnazitisi');

	q = $('<div>').addClass('pektisOnomaText');
	if (pektis.isEgo()) q.addClass('ego');
	q.text(pektis.login);
	p.append(q);

	$('<img>').addClass('pektisIcon pektisProfinfoIcon').attr({
		title: 'Προφίλ, πρόσκληση, μήνυμα κλπ',
		src: Client.server + 'images/misc/ofniforp.png',
	}).on('click', function(e) {
		Prefadoros.input.apiko(e);
		Pektis.profinfo(e, this, pektis.login);
	}).appendTo(p);

	if (id == 'NF') $('<img>').addClass('pektisIcon pektisClearIcon').attr({
		title: 'Διαγραφή νεοφερμένου',
		src: Client.server + 'images/misc/clear.png',
	}).on('click', function(e) {
		Prefadoros.input.apiko(e);
		Sinedria.niofertosDelDOM(pektis.login);
	}).appendTo(p);

	$('<div>').addClass('stisimoEndixiContainer').appendTo(p);

	return p;
}

// Η μέθοδος "snapshotSet" θέτει εκ νέου τα στοιχεία τού παίκτη όπως αυτά
// παρέχονται από το snapshot του παίκτη που περνάμε ως παράμετρο. Το snapshot
// περιέχει τα βασικά στοιχεία τού παίκτη, τις παραμέτρους του παίκτη και
// τις πληροφορίες προφίλ.

Pektis.prototype.snapshotSet = function(snapshot) {
	var i;

	this.login = globals.fetchProp(snapshot, 'p');
	this.onoma = globals.fetchProp(snapshot, 'o');

	this.peparam = {};
	if (snapshot.hasOwnProperty('r')) {
		for (i in snapshot.r) {
			this.peparam[Prefadoros.peparamOce(i)] = snapshot['r'][i];
		}
	}

	this.profinfo = {};
	if (snapshot.hasOwnProperty('f')) {
		for (i in snapshot.f) {
			this.profinfoUpdate(i, snapshot['f'][i]);
		}
	}

	this.pektisEpafi();
	return this;
}

// Υπάρχουν box DOM elements για τους παίκτες σε διάφορες περιοχές τής σελίδας, π.χ.
// περιφερόμενοι, παίκτες τραπεζιών, θεατές, νεοφερμένοι, θεατές τρέχουσας παρτίδας.
// Τα ids είναι της μορφής "IDxxxxxx", όπου "xxxxxx" είναι το login name τού παίκτη
// και το ID είναι string ανάλογο με την περιοχή στην οποία θα τοποθετηθεί το DOM
// elemnt:
//
//	RB	Περιφερόμενος παίκτης.
//
//	TH	Θεατής τραπεζιού στο καφενείο.
//
//	NF	Νεοφερμένος.
//
//	SH	Θεατής του τρέχοντος τραπεζιού.
//
// Για τους παίκτες των τραπεζιών το id ακολουθεί άλλη λογική. Πιο συγκεκριμένα,
// το id ενός παίκτη είναι της μορφής "TPtttttt:h" όπου "tttttt" είναι το τραπέζι
// και "h" είναι η θέση (1, 2, 3).
//
//	TP	Παίκτης τραπεζιού.

// Η μέθοδος "pektisBoxJQL" επιστρέφει jQuery element list για τα DOM elements που
// αφορούν κουτάκια του παίκτη στις περιοχές που καθορίζονται με την πρώτη παράμετρο.

Pektis.prototype.pektisBoxJQL = function(topos) {
	return Pektis.pektisBoxJQL(this.login, topos);
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////@

// Η function "pektisBoxJQL" δέχεται το login name κάποιου παίκτη και επιστρέφει jQuery
// element list για τα DOM elements που αφορούν στον παίκτη, είτε σε όλες τις περιοχές,
// είτε μέσα στα τραπέζια, είτε μέσα στην τσόχα, είτε εκτός τσόχας κλπ. Οι περιοχές
// καθορίζονται από τη δεύτερη παράμετρο η οποία μπορεί να είναι object με properties:
//
//	ektos	Όλα τα κουτάκια του παίκτη ως περιφερόμενου, ως θεατού στο καφενείο,
//		ως νεοφερμένου και ως θεατού στην τσόχα.
//
//	entos	Όλα τα κουτάκια του παίκτη ως παίκτη στα τραπέζια του καφενείου.
//
//	tsoxa	Τα κουτάκια του παίκτη ως παίκτη στην τσόχα.
//
//	ola	Όλα τα κουτάκια ("entos", "ektos", "tsoxa").
//
// By default θεωρούνται τα "ektos" και "entos" και εξαιρείται η τσόχα.

Pektis.pektisBoxJQL = function(login, topos) {
	var slogin, jql, thesi;

	if (topos === undefined) topos = {
		ektos: true,
		entos: true,
	};
	else if (topos.ola) topos = {
		ektos: true,
		entos: true,
		tsoxa: true,
	};

	slogin = Client.jqsel(login);
	jql = $();

	// Για λόγους τάξης προσθέτουμε τα DOM elements με τη σειρά που
	// εμφανίζονται στη σελίδα. Πρώτα εισάγουμε τους περιφερόμενους.

	if (topos.ektos) jql = jql.add('#RB' + slogin);

	// Προσθέτουμε τώρα τους παίκτες των τραπεζιών.

	if (topos.entos) {
		Skiniko.trapeziWalk(function(kodikos, trapezi) {
			for (thesi in Prefadoros.thesiValid) {
				if (trapezi.pektis(thesi) != login) continue;
				jql = jql.add('#TP' + Client.jqsel(kodikos + ':' + thesi));
			}
		});
	}

	// Εισάγουμε τις υπόλοιπες κατηγορίες.

	if (topos.ektos) jql = jql.
		add('#TH' + slogin).	// θεατές τραπεζιών
		add('#NF' + slogin).	// νεοφερμένοι
		add('#SH' + slogin);	// θεατές τρέχουσας παρτίδας

	// Εισάγονται, τέλος, τα κουτάκια που αφορούν στον παίκτη στην τσόχα.
	// Κανονικά μπορεί να βρεθεί το πολύ ΕΝΑ τέτοιο κουτάκι.

	if (topos.tsoxa && Prefadoros.ego.isTrapezi()) {
		for (thesi in Prefadoros.thesiValid) {
			if (Prefadoros.ego.trapezi.pektis(thesi) != login) continue;
			jql = jql.add($('#tsoxaPektis' + Prefadoros.tsoxa.thesiMap(thesi)).find('.pektisBox'));
		}
	}

	return jql;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////@

Pektis.iconAction = {
	filos: function(e, ico, login) {
		Prefadoros.input.apiko(e);
		ico.working();
		Client.node('sxesi', 'login=' + login.uri(), 'sxesi=F', function(rsp) {
			ico.attr({src: 'images/misc/filos.png'});
			Client.fyi.epano(rsp);
		});
	},

	apoklismos: function(e, ico, login) {
		Prefadoros.input.apiko(e);
		ico.working();
		Client.node('sxesi', 'login=' + login.uri(), 'sxesi=B', function(rsp) {
			ico.attr({src: 'images/misc/apoklismos.png'});
			Client.fyi.epano(rsp);
		});
	},

	aposisxetisi: function(e, ico, login) {
		Prefadoros.input.apiko(e);
		ico.working();
		Client.node('sxesi', 'login=' + login.uri(), function(rsp) {
			ico.attr({src: 'images/misc/Xgreen.png'});
			Client.fyi.epano(rsp);
		});
	},

	iplocatorWindow: null,

	iplocator: function(e, ico, login) {
		var sinedria;

		Prefadoros.input.apiko(e);
		ico.working();

		sinedria = Skiniko.isSinedria(login);
		if (sinedria) return Pektis.iconAction.iplocatorNow(ico, login, sinedria.ip)

		Client.node('pektisIp', 'login=' + login.uri(), function(rsp) {
			if (rsp.validIp()) return Pektis.iconAction.iplocatorNow(ico, login, rsp);
			ico.attr({src: 'images/misc/iplocator.png'});
			Client.fyi.epano(rsp);
		});
	},

	iplocatorNow: function(ico, login, ip) {
		ico.attr({src: 'images/misc/iplocator.png'});
		Pektis.iconAction.iplocatorClose();
		if (!ip.validIp()) return Client.fyi.epano(ip + ': invalid IP address');

		Pektis.iconAction.iplocatorWindow = window.open('http://www.infosniper.net/index.php?' +
			'ip_address=' + ip + '&map_source=1&overview_map=1&lang=1&map_type=1&zoom_level=7',
			'_blank', 'top=100,left=100,width=1200,height=800,resizeable=yes');
	},

	iplocatorClose: function() {
		if (!Pektis.iconAction.iplocatorWindow) return;
		Pektis.iconAction.iplocatorWindow.close();
		Pektis.iconAction.iplocatorWindow = null;
	},
};

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////@

jQuery.fn.pektisAxiomaFixDOM = function(login) {
	return this.each(function() {
		$(this).find('.pektisAxiomaIcon').axiomaIconFixDOM(Skiniko.isPektis(login));
	});
}

// Η μέθοδος "axiomaIconFixDOM" εφαρμόζεται πάνω σε εικόνες ένδειξης αξιώματος
// και σκοπό έχει να θέσει το προσήκον αρχείο εικόνας και τον προσήκοντα τίτλο
// ανάλογα με το αξίωμα του παίκτη τον οποίον περνάμε ως παράμετρο.

jQuery.fn.axiomaIconFixDOM = function(pektis) {
	return this.each(function() {
		var icon = false, title;

		if (pektis) {
			switch (pektis.axioma()) {
			case 1: icon = 'vip'; title = 'VIP'; break;
			case 2: icon = 'epoptis'; title = 'Επόπτης'; break;
			case 3: icon = 'diaxiristis'; title = 'Διαχειριστής'; break;
			case 4: icon = 'administrator'; title = 'Administrator'; break;
			case 5: icon = 'proedros'; title = 'Πρόεδρος'; break;
			}
		}

		if (icon) {
			$(this).attr({
				src: Client.server + 'images/axioma/' + icon + '.png',
				title: title,
			}).css({display: 'inline'});
		}
		else {
			$(this).css({display: 'none'}).attr({
				src: Client.server + 'images/misc/noImage.png',
			}).removeAttr('title');
		}
	});
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////@

jQuery.fn.pektisKatastasiFixDOM = function(login) {
	return this.each(function() {
		if (!login) $(this).find('.pektisOnomaText').removeClass('pektisApasxolimenos');
		else if (Skiniko.fetchPektis(login).isApasxolimenos()) $(this).find('.pektisOnomaText').
			addClass('pektisApasxolimenos');
		else $(this).find('.pektisOnomaText').removeClass('pektisApasxolimenos');
	});
}

jQuery.fn.pektisOnlineFixDOM = function(login) {
	return this.each(function() {
		if (!login) $(this).removeClass('pektisOffline')
		else if (Skiniko.isSinedria(login)) $(this).removeClass('pektisOffline')
		else $(this).addClass('pektisOffline');
	});
}

jQuery.fn.pektisSxesiFixDOM = function(login, tsoxa) {
	return this.each(function() {
		var
		onoma = $(this).find('.pektisOnoma'),
		klasi;

		if (!onoma.length) return;

		klasi = tsoxa ? ' tsoxaPektisSxesi' : '';
		if (Prefadoros.ego.pektis.isFilos(login)) onoma.
			removeClass('pektisOnomaApoklismenos').addClass('pektisOnomaFilos' + klasi);
		else if (Prefadoros.ego.pektis.isApoklismenos(login)) onoma.
			removeClass('pektisOnomaFilos').addClass('pektisOnomaApoklismenos' + klasi);
		else onoma.removeClass('pektisOnomaApoklismenos pektisOnomaFilos' + klasi);
	});
}

jQuery.fn.pektisTheatisFixDOM = function(login) {
	return this.each(function() {
		var sinedria = Skiniko.isSinedria(login);
		if (sinedria && sinedria.isTheatis()) $(this).addClass('theatis')
		else $(this).removeClass('theatis');
	});
}

// Η μέθοδος "pektisBoxDOM" εφαρμόζεται σε "pektisBox" DOM elements και θέτει mouse
// event listeners που αφορούν στην είσοδο/έξοδο του δείκτη στο κουτάκι τού παίκτη.
// Θέτει, επίσης, mouse event listener ώστε με το κλικ να αποστέλλεται πρόσκληση.

jQuery.fn.pektisBoxDOM = function(login) {
	return this.each(function() {
		var onoma, trapezi;

		onoma = $(this).off('mouseenter mouseleave').find('.pektisOnoma');
		if (!onoma.length) return;

		if (!login) login = onoma.text();

		// Αν υπάρχει παίκτης στο κουτάκι τού παίκτη, τότε φροντίζουμε
		// κατά την είσοδο/έξοδο τού δείκτη στο κουτάκι του παίκτη, να
		// εμφανίζονται/αποκρύπτονται αρκετά στοιχεία τού παίκτη στο
		// κάτω μέρος της σελίδας.

		if (login) $(this).on('mouseenter', function(e) {
			var pektis, msg;

			$(this).find('.pektisOnoma').addClass('pektisOnomaEntono');
			pektis = Skiniko.isPektis(login);
			msg = '<span class="mavro">Παίκτης: <span class="entono ble';
			if (pektis) {
				msg += '">' + pektis.onoma + '</span> [ <span class="entono ';
				if (Prefadoros.ego.pektis.isFilos(login)) msg += 'prasino';
				else if (Prefadoros.ego.pektis.isApoklismenos(login)) msg += 'kokino';
				else msg += 'ble';
				msg += '">' + login + '</span> ]';
				if (pektis.isVip()) msg += ' <span class="entono plagia">' +
					pektis.peparamDecode('ΑΞΙΩΜΑ', pektis.axioma()) + '</span>';
			}
			else {
				msg += '">' + login + '</span>';
			}
			msg += '</span>';
			Client.fyi.kato(msg);
			Pektis.profinfoEpilogi(login, true);
		}).on('mouseleave', function(e) {
			$(this).find('.pektisOnoma').removeClass('pektisOnomaEntono');
			Client.fyi.kato();
			Pektis.profinfoEpilogi(login, false);
		});

		// Αν δεν υπάρχει παίκτης στο κουτάκι (αυτό ισχύει στις κενές θέσεις τών
		// τραπεζιών), τότε ακυρώνουμε οποιαδήποτε ενέργεια κατά την είσοδο/έξοδο
		// τού δείκτη στο κουτάκι τού παίκτη.

		else $(this).off('mouseenter').off('mouseleave');

		// Αν υπάρχει παίκτης στο κουτάκι τού παίκτη και μπορούμε να προσκαλέσουμε
		// παίκτη στο δικό μας τραπέζι, δίνουμε τη δυνατότητα πρόσκλησης με κλικ.

		onoma.addClass('pektisProsklisi').attr({
			title: 'Πρόσκληση',
		}).off('click').on('click', function(e) {
			Prosklisi.apostoli(e, $(this).text());
		});
	});
}

jQuery.fn.pektisFixDOM = function(login) {
	return this.each(function() {
		$(this).find('.pektisOnomaText').text(login ? login : '');
		$(this).
			pektisTheatisFixDOM(login).
			pektisOnlineFixDOM(login).
			pektisSxesiFixDOM(login).
			pektisAxiomaFixDOM(login).
			pektisKatastasiFixDOM(login);
		$(this).not('.tsoxaPektisBox').pektisBoxDOM(login);
	});
}

Pektis.prototype.pektisRebelosJQL = function() {
	return $('#RB' + this.login.jqsel());
}

Pektis.prototype.pektisRebelosAddDOM = function() {
	this.pektisDOM('RB').pektisFixDOM(this.login).prependTo('#rebelosArea');
	return this;
}

Pektis.prototype.pektisRebelosDelDOM = function() {
	this.pektisRebelosJQL().stop().fadeOut(function() {
		$(this).remove();
	});
	return this;
}
